package com.shujia

object Code25ListFunction {
  def main(args: Array[String]): Unit = {

    /**
     * 5.filter函数
     * 格式： 要求传入一个函数 其函数参数为单个元素类型 返回值是一个布尔值类型
     * 作用：对数据进行过滤
     * 应用场景： 相当于where条件过滤
     *
     * 6.SortBy函数
     * 格式： 要求传入一个函数 返回排序的信息
     * 作用：对数据按升序方式排序
     *
     * 7.sortWith
     * 格式： 要求传入一个函数  函数的参数是两个需要比较的元素，返回两个元素比较的结果
     * 作用： 根据自定义要求比较元素大小
     *
     * 注意：排序时，如果是字符串，那么是按照字典序排序
     *
     * 8.union
     * 格式：要求传入另外一个集合
     * 作用：将两个集合数据进行拼接
     *
     * 9.sliding
     *    格式：要求传入两个参数 第一个表示窗口大小 第二个表示窗口移动的步长
     *    作用：可以实现SQL中的窗口函数作用
     *
     */


    val list: List[ListStu] = List(
      ListStu("1", "张三", 20),
      ListStu("21", "李四", 22),
      ListStu("3", "王五", 25),
      ListStu("3", "赵六", 18)
    )



    list.filter(
      (listStu: ListStu) => listStu.age > 20
    ).foreach(println)


//    list.sorted[ListStu] ()


    list.sortBy(
      (listStu: ListStu) => -listStu.age
    ).foreach(println)

    println("***********")
    list.sortWith(
      (stu1: ListStu, stu2: ListStu) => {
        stu1.age < stu2.age
      }
    ).foreach(println)


    println("=======================")
    // 多列排序
    list.sortBy(
      (listStu: ListStu) => listStu.id.toInt * 100 + listStu.age
    ).foreach(println)

    println("***********")
    list.sortWith(
      (stu1: ListStu, stu2: ListStu) => {
        if (stu1.id > stu2.id) {
          true
        } else if (stu1.id == stu2.id) {
          if (stu1.age > stu2.age) {
            true
          } else {
            false
          }
        } else {
          false
        }
      }
    ).foreach(println)

    println("----------------------")
    list.sortBy(
      (listStu:ListStu) => {listStu.id}
    ).foreach(println)


    println("--------------")
    val list2: List[ListStu] = List(
      ListStu("5", "张三", 21),
      ListStu("6", "李四", 24),
    )

    list.union(list2).toList.foreach(println)


    val intList: List[Int] = List(2, 3, 1, 5, 2, 3, 6, 3, 5)
    // def sliding(size: Int, step: Int)
    intList.sliding(2,1).foreach(println) // 滑动窗口
    println("+++++++++++")
    intList.sliding(2,2).foreach(println) // 滚动窗口

  }
}

case class ListStu(id: String, name: String, age: Int)
//  extends Ordering[ListStu] {
//  override def compare(x: ListStu, y: ListStu): Int = ???
//}